Graficacion en ggplot2 y quarto

Introducción

Este documento presenta un conjunto de visualizaciones de datos elaborados con paquetes del lenguaje R como ggplot2, ploty y DT.

Carga de bibliotecas

library(tidyverse)
library(plotly)
library(DT)
library(gapminder)
library(palmerpenguins)
library(ggthemes)
library(hrbrthemes)
library(ggplot2)

Carga de datos

Código
#Carga de datos del paquete mpg

mpg |>
  datatable(options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

Diamonds

Código
#Carga de datos del paquete diamonds

diamonds |>
  datatable(options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

Gapminder

Código
#Carga de datos del paquete gapminder

gapminder |>
  filter(year == 2007) |>
  datatable(options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

COVID

Código
# Carga del archivo CSV de entrada en un dataframe
# con la función read_delim() de readr
covid_general <-
  read_delim(
    file = "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2023-i/main/datos/ministerio-salud/covid/05_30_22_CSV_GENERAL.csv",
    col_select = c(
      "FECHA",
      "positivos",
      "activos",
      "RECUPERADOS",
      "fallecidos",
      "nue_posi",
      "nue_falleci",
      "salon",
      "UCI"
    )
  )

# Cambio de nombre de columnas
covid_general <-
  covid_general |>
  rename(
    fecha = FECHA,
    recuperados = RECUPERADOS,
    nuevos_positivos = nue_posi,
    nuevos_fallecidos = nue_falleci,
    uci = UCI
  )

# Cambio de tipo de datos de la columna fecha, de str a date
covid_general <-
  covid_general |>
  mutate(fecha = as.Date(fecha, format = "%d/%m/%Y"))


# Despliegue de datos 

covid_general |>
  datatable(options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

Delitos 2022

Código
# Carga de datos
delitos_2022 <-
  read_delim(
    file = "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2023-i/main/datos/oij/estadisticas-policiales/estadisticaspoliciales2022.csv"
  )

# Tabla de datos
delitos_2022 |>
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

Opciones basicas de ggplot2

# Forma basica

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))

# foma alternativa con pipes

mpg |>
  ggplot(aes(x = displ, y = hwy)) +
  geom_point()

Variables adicionales

# class- color

mpg |>
  ggplot(aes(x = displ, y = hwy, color = class)) +
  geom_point()

variables de figuras

# class- shape


mpg |>
  ggplot(aes(x = displ, y = hwy, shape = class)) +
  geom_point()

# class- shape color

# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# con formas y colores correspondientes al tipo de automóvil
mpg |>
  ggplot(aes(x = displ, y = hwy, shape = class, color = class)) +
  geom_point() +
  scale_shape_manual(values = c(0, 1, 2, 3, 4, 5, 6)) +
  scale_color_manual(values = c("red", "blue", "green", "purple", "orange", "brown", "pink"))

mpg |>
  ggplot(aes(x = hwy, y = cty, size = displ)) +
  geom_point()

plotly

# Gráfico ggplot2
grafico_ggplot2 <-
  mpg |>
  ggplot(aes(x = displ, y = hwy, color = drv)) +
  geom_point(aes(
    # datos que se muestran al colocar el ratón sobre un punto
    text = paste0(
      "Modelo: ", manufacturer, " ", model, " ", year, "\n",
      "Cilindrada: ", displ, " l", "\n",
      "Rendimiento en autopista: ", hwy, " mpg", "\n",
      "Tipo de tracción: ", drv,  "\n",
      "Tipo de transmisión: ", trans 
    )
  )) +
  geom_smooth() +
  ggtitle("Cilindrada vs rendimiento en autopista") +
  xlab("Cilindrada (l)") +
  ylab("Rendimiento en autopista (mpg)") +
  labs(subtitle = "Datos de 38 modelos de automóviles de años entre 1999 y 2008",
       caption = "Fuente: United States Environmental Protection Agency (EPA)",
       color = "Tipo de tracción") +
  theme_ipsum()
Warning in geom_point(aes(text = paste0("Modelo: ", manufacturer, " ", model, :
Ignoring unknown aesthetics: text
# Gráfico plotly
ggplotly(grafico_ggplot2, tooltip = "text") |> 
  config(locale = 'es') # para mostrar los controles en español
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Tipos de graficos

Histogramas

# | label: histogramas
# Histograma ggplot2 de distribución del PIB per cápita en 2007
histograma_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = gdpPercap)) +
  geom_histogram(
    aes(
      text = paste0(
        "PIB per cápita (valor medio del rango): $", round(after_stat(x), 2), "\n",
        "Frecuencia: ", after_stat(count)
      ),
      y = after_stat(density) # argumento necesario para crear la curva KDE
    ),
    bins = 10
  ) +
  geom_density() +
  scale_y_continuous(labels = scales::label_comma()) + # para formatear el eje y en notación decimal
  ggtitle("Distribución del PIB per cápita en 2007") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Densidad") +
  labs(subtitle = "Datos de 140 países", caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_histogram(aes(text = paste0("PIB per cápita (valor medio del
rango): $", : Ignoring unknown aesthetics: text
# Histograma plotly
ggplotly(histograma_ggplot2, tooltip = "text") |>
  config(locale = 'es')
# | label: histogramas
# Histograma ggplot2 de distribución del PIB per cápita en 2007
histograma_ggplot2 <- 
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = gdpPercap)) +
  geom_histogram(
    aes(
      text = paste0(
        "PIB per cápita (valor medio del rango): $", round(after_stat(x), 2), "\n",
        "Frecuencia: ", after_stat(count)
      )
    ), 
    bins = 10
  ) + 
  ggtitle("Distribución del PIB per cápita en 2007") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Frecuencia") +
  labs(subtitle = "Datos de 14o países", caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_histogram(aes(text = paste0("PIB per cápita (valor medio del
rango): $", : Ignoring unknown aesthetics: text
# Histograma plotly
ggplotly(histograma_ggplot2, tooltip = "text") |> 
  config(locale = 'es')
# | label: histogrmas
# Histograma ggplot2 de distribución del PIB per cápita en 2007 por continente
histograma_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = gdpPercap, fill = continent)) +
  geom_histogram(
    aes(
      text = paste0(
        "Continente: ", after_stat(fill), "\n",
        "PIB per cápita (valor medio del rango): $", round(after_stat(x), 2), "\n",
        "Frecuencia: ", after_stat(count)
      ),      
      y = after_stat(density)
    ),    
    bins = 10
  ) +
  ggtitle("Distribución del PIB per cápita en 2007 por continente") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Densidad") +
  labs(subtitle = "Datos de 140 países",
       caption = "Fuente: Gapminder.org",
       fill = "Continente") +
  theme_economist()
Warning in geom_histogram(aes(text = paste0("Continente: ", after_stat(fill), :
Ignoring unknown aesthetics: text
# Histograma plotly
ggplotly(histograma_ggplot2, tooltip = "text") |>
  config(locale = 'es')

Grafico de caja

# Gráfico de caja ggplot2 de distribución del PIB per cápita en 2007
grafico_caja_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x= continent, y = gdpPercap)) +
  geom_boxplot() +
  ggtitle("Distribución del PIB per cápita en 2007") +
  ylab("PIB per cápita ($ EE.UU.)") +
  labs(subtitle = "Datos de 140 países", caption = "Fuente: Gapminder.org") +
  theme_economist()

# Gráfico de caja plotly
ggplotly(grafico_caja_ggplot2) |> 
  config(locale = 'es')

Grafico de barras

# | label: grafico de barras 
# | warning: false
# | message: false

# Gráfico de barras con conteo de países por continente para el año 2007
grafico_barras_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = continent)) +
  geom_bar(
    aes(
      text = paste0(
        "Cantidad de países: ", after_stat(count)
      )
    ),    
  ) +
  ggtitle("Cantidad de países por continente") +
  xlab("Continente") +
  ylab("Cantidad de países") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_bar(aes(text = paste0("Cantidad de países: ",
after_stat(count))), : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')
# | label: grafico de barras  diamantes
# | warning: false
# | message: false
# Gráfico de barras con conteo de diamantes por corte
grafico_barras_ggplot2 <-
diamonds |>
  ggplot(aes(x = fct_rev(cut))) +
  geom_bar(
    aes(
      text = paste0(
        "Cantidad de diamantes: ", after_stat(count)
      )
    )
  ) +
  ggtitle("Cantidad de diamantes por corte") +
  xlab("Corte") +
  ylab("Cantidad de diamantes") +
  theme_economist()
Warning in geom_bar(aes(text = paste0("Cantidad de diamantes: ",
after_stat(count)))): Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')

construya un grafico de barras qe muestre la cantidad de carros por clase (suv, etc), en el conjunto de datos mpg

# | label: grafico de barras  carros
# | warning: false
# | message: false
grafico_barras_ggplot2 <-
mpg |>
  ggplot(aes(x = fct_infreq(class))) +
  geom_bar(
    aes(
      text = paste0(
        "Cantidad de carros: ", after_stat(count)
      )
    )
  ) +
  ggtitle("Cantidad de carros ") +
  xlab("Autos") +
  ylab("Cantidad de carros") +
  theme_economist()
Warning in geom_bar(aes(text = paste0("Cantidad de carros: ",
after_stat(count)))): Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')
# | label: grafico de barras  experiencia vida promedio 
# | warning: false
# | message: false

# Gráfico de barras con promedio de esperanza de vida
# para cada continente para el año 2007
grafico_barras_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = fct_infreq(continent), y = lifeExp)) +
  geom_bar(
    stat = "summary", 
    fun.y = "mean",
    aes(
      text = paste0(
        "Promedio de esperanza de vida: ", round(after_stat(y), 2)
      )
    )
  ) +
  ggtitle("Promedio de esperanza de vida por continente en 2007") +
  xlab("Continente") +
  ylab("Promedio de esperanza de vida") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_bar(stat = "summary", fun.y = "mean", aes(text =
paste0("Promedio de esperanza de vida: ", : Ignoring unknown parameters:
`fun.y`
Warning in geom_bar(stat = "summary", fun.y = "mean", aes(text =
paste0("Promedio de esperanza de vida: ", : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |>
  config(locale = 'es')
No summary function supplied, defaulting to `mean_se()`

Barras sin transformaciones estadisticas

# Gráfico de barras con población de países 
# de América para el año 2007
grafico_barras_ggplot2 <-
gapminder |>
  filter(year == 2007 & continent == "Americas") |>
  ggplot(aes(x = reorder(country, pop), y = pop/1000000)) +
  geom_col(
    aes(
      text = paste0(
        "País: ", country, "\n",
        "Población (millones de habitantes): ", round(pop/1000000, 2)
      )
    )
  ) +
  coord_flip() + # para mostrar barras horizontales
  ggtitle("Población de países de América en 2007") +
  xlab("País") +
  ylab("Población (millones de habitantes)") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_col(aes(text = paste0("País: ", country, "\n", "Población
(millones de habitantes): ", : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')

TRANSFORMACIONES

# | label: grafico-barras
# Gráfico de barras con conteo de países por continente para el año 2007
grafico_barras_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = continent)) +
  geom_bar(
    aes(
      text = paste0(
        "Cantidad de países: ", after_stat(count)
      )
    ),    
  ) +
  ggtitle("Cantidad de países por continente") +
  xlab("Continente") +
  ylab("Cantidad de países") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_bar(aes(text = paste0("Cantidad de países: ",
after_stat(count))), : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')
# | label: grafico-barras poblacion 

# Gráfico de barras con promedio de esperanza de vida
# para cada continente para el año 2007
grafico_barras_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = fct_infreq(continent), y = lifeExp)) +
  geom_bar(
    stat = "summary", 
    fun.y = "mean",
    aes(
      text = paste0(
        "Promedio de esperanza de vida: ", round(after_stat(y), 2)
      )
    )
  ) +
  ggtitle("Promedio de esperanza de vida por continente en 2007") +
  xlab("Continente") +
  ylab("Promedio de esperanza de vida") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_bar(stat = "summary", fun.y = "mean", aes(text =
paste0("Promedio de esperanza de vida: ", : Ignoring unknown parameters:
`fun.y`
Warning in geom_bar(stat = "summary", fun.y = "mean", aes(text =
paste0("Promedio de esperanza de vida: ", : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |>
  config(locale = 'es')
No summary function supplied, defaulting to `mean_se()`
# Gráfico de barras con población de países 
# de América para el año 2007
grafico_barras_ggplot2 <-
gapminder |>
  filter(year == 2007 & continent == "Americas") |>
  ggplot(aes(x = reorder(country, pop), y = pop/1000000)) +
  geom_col(
    aes(
      text = paste0(
        "País: ", country, "\n",
        "Población (millones de habitantes): ", round(pop/1000000, 2)
      )
    )
  ) +
  coord_flip() + # para mostrar barras horizontales
  ggtitle("Población de países de América en 2007") +
  xlab("País") +
  ylab("Población (millones de habitantes)") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_col(aes(text = paste0("País: ", country, "\n", "Población
(millones de habitantes): ", : Ignoring unknown aesthetics: text
# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')

Barras apiladas

# Gráfico de barras apiladas por tipo de corte y claridad 
grafico_barras_ggplot2 <-
diamonds |>
  ggplot(aes(x = cut, fill = clarity)) +
  geom_bar() +
  ggtitle("Cantidad de diamantes por corte y claridad") +
  xlab("Corte") +
  ylab("Cantidad de diamantes") +
  labs(fill = "Claridad") +
  theme_minimal()

# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2) |> 
  config(locale = 'es')
# Gráfico de barras apiladas por tipo de corte y claridad 
grafico_barras_ggplot2 <-
diamonds |>
  ggplot(aes(x = cut, fill = clarity)) +
  geom_bar(position = "fill") +
  ggtitle("Proporción de tipos de claridad en cortes de diamantes") +
  xlab("Corte") +
  ylab("Proporción") +
  labs(fill = "Claridad") +
  theme_minimal()

# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2) |> 
  config(locale = 'es')
# Gráfico de dispersión PIB per cápita vs esperanza de vida en 2007
# + línea de tendencia
grafico_dispersion_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = gdpPercap, y = lifeExp)) +
  geom_point(aes(
    text = paste0(
      "País: ", country, "\n",
      "PIB per cápita: $", round(gdpPercap, 2), "\n",
      "Esperanza de vida: ", round(lifeExp, 2), " años"
    )
  )) +
  geom_smooth(method = "lm") +
  ggtitle("PIB per cápita vs esperanza de vida en 2007") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Esperanza de vida (años)") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()  
Warning in geom_point(aes(text = paste0("País: ", country, "\n", "PIB per
cápita: $", : Ignoring unknown aesthetics: text
# Gráfico de dispersión plotly
ggplotly(grafico_dispersion_ggplot2, tooltip = "text") |>
  config(locale = 'es')
`geom_smooth()` using formula = 'y ~ x'
# Gráfico de líneas con la evolución de los casos de COVID
grafico_lineas_ggplot2 <-
  covid_general |>
  ggplot(aes(x = fecha, y = value, color = variable)) +
  geom_line(aes(y = positivos, color = "Positivos")) +
  geom_line(aes(y = recuperados, color = "Recuperados")) +
  geom_line(aes(y = activos, color = "Activos")) +
  geom_line(aes(y = fallecidos, color = "Fallecidos")) +
  scale_color_manual( # colores
    "",
    values = c(
      "Positivos" = "blue",
      "Recuperados" = "green",
      "Activos" = "red",
      "Fallecidos" = "black"
    )
  ) +
  ggtitle("Casos acumulados de COVID en Costa Rica al 2022-05-30") +
  xlab("Fecha") +
  ylab("Casos") +
  theme_economist()  

# Gráfico de dispersión plotly
ggplotly(grafico_lineas_ggplot2) |>
  config(locale = 'es')

Grafico de lineas 2 que muestre la evolucion en el tiempo de los casos de covid hospitalizados en salon y en UCI

# Gráfico de líneas con la evolución de los casos de COVID
grafico_lineas_ggplot2 <-
  covid_general |>
  ggplot(aes(x = fecha, y = value, color = variable)) +
  geom_line(aes(y = salon, color = "hospitalizados")) +
  geom_line(aes(y = uci, color = "UCI")) +
  scale_color_manual( # colores
    "",
    values = c(
      "hospitalizados" = "blue",
      "UCI" = "green"
    )
  ) +
  ggtitle("Casos acumulados de COVID en Costa Rica uci vs hospitalizados") +
  xlab("Fecha") +
  ylab("Casos") +
  theme_economist()  

# Gráfico de dispersión plotly
ggplotly(grafico_lineas_ggplot2) |>
  config(locale = 'es')

Grafico de pastel

# | label: grafico-pastel 

# Carga de datos
delitos_2022 <-
  read_delim(
    file = "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2023-i/main/datos/oij/estadisticas-policiales/estadisticaspoliciales2022.csv"
  )
Rows: 96651 Columns: 12
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (12): Delito, SubDelito, Fecha, Hora, Victima, SubVictima, Edad, Genero,...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Crear tabla de frecuencias
tabla_frecuencias_delitos_2022_provincias <- table(delitos_2022$Provincia)

# Convertir la tabla en un data frame
delitos_2022_provincias <- as.data.frame(tabla_frecuencias_delitos_2022_provincias)

# Cambiar nombres de columnas del data frame
delitos_2022_provincias <-
  delitos_2022_provincias |>
  rename(Provincia = Var1, Frecuencia = Freq)

# Calcular porcentajes por provincia
delitos_2022_provincias$Porcentaje <-
  100 * delitos_2022_provincias$Frecuencia / sum(delitos_2022_provincias$Frecuencia)

# Crear gráfico de pastel utilizando ggplot2
grafico_pastel_ggplot2 <-
  delitos_2022_provincias |>
  ggplot(aes(x = "", y = Porcentaje, fill = Provincia)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  theme_void() +
  labs(title = "Porcentaje de delitos cometidos en 2022 por provincia",
    subtitle = "Fuente: OIJ") +
  scale_fill_discrete(name = "Provincia") +
  geom_text(
    aes(label = paste0(round(Porcentaje, 1), "%")),
    position = position_stack(vjust = 0.5),
    color = "white",
    size = 4
  ) 

# Despliegue del gráfico
grafico_pastel_ggplot2